package com.interviews.threadlocal;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * 加锁
 *
 * 这样的结果是正常的，没有出现重复的时间。但是由于我们使用了 synchronized 关键字，就会陷入一种排队的状态，多个线程不能同时工作，这样一来，整体的效率就被大大降低了。有没有更好的解决方案呢？
 *
 * 我们希望达到的效果是，既不浪费过多的内存，同时又想保证线程安全。经过思考得出，可以让每个线程都拥有一个自己的 simpleDateFormat 对象来达到这个目的，这样就能两全其美了。
 *
 * @author qian
 * @version 1.0
 * @date 2022/3/3 16:37
 */
public class ThreadLocalDemo05 {



            public static ExecutorService threadPool = new ThreadPoolExecutor(16, 16, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingDeque<>(), new ThreadLocalDemo03.ThreadLocalDemo03ThreadFactory("SimpleDateFormat05"));

            static SimpleDateFormat dateFormat = new SimpleDateFormat("mm:ss");



            public static void main(String[] args) throws InterruptedException {

                for (int i = 0; i < 1000; i++) {

                    int finalI = i;

                    threadPool.submit(new Runnable() {

                        @Override

                public void run() {

                            String date = new ThreadLocalDemo05().date(finalI);

                            System.out.println(date);

                        }

                    });

                }

                threadPool.shutdown();

            }



            public String date(int seconds) {

                Date date = new Date(1000 * seconds);

                String s = null;

                synchronized (ThreadLocalDemo05.class) {

                    s = dateFormat.format(date);

                }

                return s;

            }

        }

